import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-13
 * Time: 21:56
 */
public class Solution {
//     思路:
//     位运算
//     用一个数字的 后26位 表示一个单词都出现了哪些字母, 为 1 表示出现了这个字母
//     两个数字, a,b 只有 (a&b)==0 则表示两个单词没有出现同一个字母
//     用一个数字挨个与其他的数字比较,(a&b)==0, 就相乘, 乘积与最大值比较, 更新最大值
    public int maxProduct(String[] words) {
        int max=0;
        // map 存储一个单词对应的数字 以及这个单词的长度
        // 使用map, 使得查找效率更高
        Map<Integer,Integer> map=new HashMap<>();
        // 记录每个单词对应的数字 以及这个单词的长度
        for(String str: words){
            int len=str.length();
            int temp=0;
            // 计算这个单词对应的数字
            for(int i=0;i<len;i++){
                temp|=1<<(str.charAt(i)-'a');
            }
            // 包含的字母都是一样的单词, 记录其中长度最大的一个
            int original=map.getOrDefault(temp, 0);
            if(len>original){
                map.put(temp,len);
            }
        }
        Set<Integer> set=map.keySet();
        for(int key1: set){
            for(int key2: set){
                // 如果没有包含相同的字母
                if((key1&key2)==0){ // 这里注意 "==" 的优先级高于 "&", 所以要加括号
                    int len1=map.get(key1);
                    int len2=map.get(key2);
                    // 更新乘积的最大值
                    max=Math.max(max, len1*len2);
                }
            }
        }
        return max;
    }
}
